package system

import (
	"context"
	"go-admin/app/global/app"
	"go-admin/app/models"
	"gorm.io/gorm"
)

// SysFile 文件附件模型
type SysFile struct {
	models.BaseModel
	Name      string `gorm:"type:varchar(255);comment:文件名" json:"name"`
	Path      string `gorm:"type:varchar(255);comment:文件路径" json:"path"`
	Size      int    `gorm:"type:int(10);comment:文件大小(字节)" json:"size"`
	Ftype     string `gorm:"type:varchar(100);comment:文件类型" json:"ftype"`
	CreatedBy uint   `gorm:"type:int(11);comment:创建者ID" json:"createdBy"`
	Suffix    string `gorm:"type:varchar(100);comment:文件后缀" json:"suffix"`
	Url       string `gorm:"type:varchar(255);comment:文件访问URL" json:"url"`
	// 添加与User模型的关联
	User     SysUsers `gorm:"foreignKey:id;references:created_by" json:"user"`
	TenantID uint     `gorm:"type:int(11);column:tenant_id;comment:租户ID" json:"tenantID"`
}

// SysFileList 文件附件列表
type SysFileList []SysFile

// NewSysFile 创建文件附件实例
func NewSysFile() *SysFile {
	return &SysFile{}
}

// NewSysFileList 创建文件附件列表实例
func NewSysFileList() *SysFileList {
	return &SysFileList{}
}

// TableName 指定表名
func (SysFile) TableName() string {
	return "sys_file"
}

// GetByID 根据ID获取文件附件
func (m *SysFile) GetByID(c context.Context, id uint) error {
	return app.DB().WithContext(c).First(m, id).Error
}

// Create 创建文件附件记录
func (m *SysFile) Create(c context.Context) error {
	return app.DB().WithContext(c).Create(m).Error
}

// Update 更新文件附件记录
func (m *SysFile) Update(c context.Context) error {
	return app.DB().WithContext(c).Save(m).Error
}

// Delete 软删除文件附件记录
func (m *SysFile) Delete(c context.Context) error {
	return app.DB().WithContext(c).Delete(m).Error
}

// IsEmpty 检查模型是否为空
func (m *SysFile) IsEmpty() bool {
	return m.ID == 0
}

// Find 查询文件附件列表
func (l *SysFileList) Find(c context.Context, funcs ...func(*gorm.DB) *gorm.DB) error {
	return app.DB().WithContext(c).Model(&SysFile{}).Scopes(funcs...).Find(l).Error
}

// GetTotal 获取文件附件总数
func (l *SysFileList) GetTotal(c context.Context, query ...func(*gorm.DB) *gorm.DB) (int64, error) {
	var count int64
	err := app.DB().WithContext(c).Model(&SysFile{}).Scopes(query...).Count(&count).Error
	return count, err
}
